%rotate(+L1,+N,-L2).

rotate([],_,[]):-!.
rotate(L,0,L):-!.
rotate(L1,N,L2):-
    N>0,!,
    rotate1(L1,N,L2).
rotate(L1,N,L2):-
    N<0,!,
    rotate2(L1,N,L2).
    
rotate1(L1,N,L2):-
    split(L1,N,LL,LR),
    append(LR,LL,L2).
    
rotate2(L1,N,L2):-
    length(L1,Length),
    Key is Length + N,
    split(L1,Key,LL,LR),
    append(LR,LL,L2).


%my_length(+L1,-N).
my_length([],0):-!.
my_length([_|T],N):-
    my_length(T,N1),
    N is N1 + 1.





% ?- split(+L,+N,+L1,+L2).

split([],_,[],[]).
split(L,N,L1,L2):-
    split(L,N,L1,L2,[]).
    
split(L2,0,L1,L2,L1):-!.
split([X|T],N,L1,L2,Acc):-
    my_append(Acc,[X],Acc1),
    N1 is N - 1,
    split(T,N1,L1,L2,Acc1).
    
my_append([],L,L).
my_append([H|T],L,[H|Tail]):-
    my_append(T,L,Tail).



my_reverse([],[]).
my_reverse(L1,L2):-
    my_reverse(L1,L2,[]).

my_reverse([],L2,L2):-!.
my_reverse([X|T],L2,Acc):-
    append([X],Acc,Acc1),
    my_reverse(T,L2,Acc1).